package com.autumn.platform.core.crypto;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class AESUtils extends CryptoUtils {

    private static final String KEY_ALGORITHM = "AES";

    public static String encrypt(String plantText, String key) {
        try {
            Cipher cipher = getCipher(KEY_ALGORITHM);
            SecretKey secretKey = getSecretKey(key);
            byte[] data = plantText.getBytes();
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] result = cipher.doFinal(data);
            return encodeToString(result);
        } catch (InvalidKeyException e) {
            throw new RuntimeException(e);
        } catch (IllegalBlockSizeException e) {
            throw new RuntimeException(e);
        } catch (BadPaddingException e) {
            throw new RuntimeException(e);
        }
    }

    public static String decrypt(String encryptText, String key) {
        try {
            Cipher cipher = getCipher(KEY_ALGORITHM);
            SecretKey secretKey = getSecretKey(key);
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] data = decodeFromString(encryptText);
            byte[] result = cipher.doFinal(data);
            return new String(result);
        } catch (InvalidKeyException e) {
            throw new RuntimeException(e);
        } catch (IllegalBlockSizeException e) {
            throw new RuntimeException(e);
        } catch (BadPaddingException e) {
            throw new RuntimeException(e);
        }
    }

    private static SecretKey getSecretKey(final String key) {
        try {
            Provider provider = getProvider();
            KeyGenerator kg = null;
            if (null == provider) {
                kg = KeyGenerator.getInstance(KEY_ALGORITHM);
            } else {
                kg = KeyGenerator.getInstance(KEY_ALGORITHM, provider);
            }
            kg.init(128, new SecureRandom(key.getBytes()));
            SecretKey secretKey = kg.generateKey();
            return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);// 转换为AES专用密钥
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}
